home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / exyacc < prev    next >
Text File  |  1991-01-08  |  1KB  |  54 lines

  1. #!/usr/bin/perl
  2.  
  3. # Usage: exyacc [-n] [yaccfiles]
  4.  
  5. $num = shift if $ARGV[0] =~ /^-n/;
  6.  
  7. undef $/;
  8. $* = 1;         # Treat $_ as multi-line buffer.
  9.  
  10. while (<>) {    # One file at a time because of undef above.
  11.  
  12.         # First pull out the rules section.
  13.         #   (Note: Assumes no comment includes "\n%%").
  14.  
  15.     $start = index($_,"\n%%") + 1;
  16.     $end = rindex($_,"\n%%") + 1;
  17.     $_ = substr($_, $start, $end - $start);
  18.     s/.*\n//;;                  # Delete the %% line.
  19.  
  20.         # Save curly brackets used as tokens.
  21.  
  22.     s/'{'/'\200'/g;             # Keep length same for inplace.
  23.     s/'}'/'\201'/g;
  24.  
  25.         # Strip comments.
  26.  
  27.     s#\*/#\202\202#g;           # Make terminator easy to find
  28.     s#/\*[^\202]*\202\202##g;
  29.  
  30.         # Strip {}'s from the inside out;
  31.         # several passes handle nesting.
  32.  
  33.     0 while s/{[^}{]*}//g;
  34.  
  35.         # Restore any curly brackets used as tokens.
  36.  
  37.     s/'\200'/'{'/g;
  38.     s/'\201'/'}'/g;
  39.  
  40.         # Eliminate unwanted blank lines.
  41.  
  42.     0 while s/^[ \t]*\n(\s)/$1/g;
  43.  
  44.         # Number rules if desired.
  45.         # Assumes | always starts line.
  46.  
  47.     $seq = 0;
  48.     s/^(\w*\s*[:|])/$1 . ++$seq/eg if $num;
  49.  
  50.         # And there you have it...
  51.  
  52.     print;
  53. }
  54.